﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace PhoobearLibs.Resource.Resx
{
    /// <summary>
    /// 주어진 키를 가지고 값을 뽑아내거나
    /// 주어진 값을 가지고 키를 뽑아냅니다.
    /// </summary>
    /// <typeparam name="TValue">값 타입</typeparam>
    public static class ResourceFieldExtractor<TValue>
    {
        /// <summary>
        /// 주어진 값과 정확히 일치하는 Value들을 담은 레코드들을 소스 리소스에서 추출 합니다.
        /// </summary>
        /// <param name="source">소스 리소스</param>
        /// <param name="values">찾을 값 목록</param>
        /// <returns>찾는 값과 일치하는 값들이 들어있는 레코드 목록</returns>
        public static IEnumerable<KeyValuePair<string, TValue>> ExtractKeys(Resource<TValue> source, IEnumerable<TValue> values)
        {

            var result = from s in source.Data
                         join v in values
                         on s.Value equals v into m
                         from x in m
                         select new KeyValuePair<string, TValue>(s.Key, x);
            
            return result;
        }

        /// <summary>
        /// 주어진 값에 대해서 주어진 비교 조건에 일치하는 Value들을 담은 레코드들을 소스 리소스에서 추출 합니다.
        /// </summary>
        /// <param name="source">소스 리소스</param>
        /// <param name="values">찾을 값 목록</param>
        /// <param name="comparer">비교 조건</param>
        /// <returns>찾는 값과 일치하는 값들이 들어있는 레코드 목록</returns>
        public static IEnumerable<KeyValuePair<string, TValue>> ExtractKeys(Resource<TValue> source, IEnumerable<TValue> values, Func<TValue, TValue, bool> comparer)
        {
            List<KeyValuePair<string, TValue>> resultList = new List<KeyValuePair<string, TValue>>();

            foreach (var item in values)
	        {
                var result = from s in source.Data
                             where comparer(s.Value, item) == true                         
                             select new KeyValuePair<string, TValue>(s.Key, s.Value);

                resultList.AddRange(result);
	        }

            return resultList;
        }

        /// <summary>
        /// 주어진 키와 정확히 일치하는 키를 지닌 레코드들을 소스 리소스에서 추출합니다. 
        /// </summary>
        /// <param name="source">소스 리소스</param>
        /// <param name="keys">찾을 키</param>
        /// <returns>찾는 키와 일치하는 값들이 들어있는 레코드 목록</returns>
        public static IEnumerable<KeyValuePair<string, TValue>> ExtractValues(Resource<TValue> source, IEnumerable<string> keys)
        {
            var result = from s in source.Data
                         join k in keys
                         on s.Key equals k into m
                         from x in m
                         select new KeyValuePair<string, TValue>(x, s.Value);                        

            return result;            
        }


    }
}
